# SVmatrix package # Version 0.2.0 # Подробнее о матрице http://svmatrix.online/ # Связаться с автором пакета z@svmatrix.online # Необходимые для работы пакеты # Установка (1 раз) install.packages("data.table") install.packages("ggplot2") install.packages("dplyr") install.packages("circlize") install.packages("RColorBrewer") install.packages("extrafont") # Подключение (с каждым запуском) library(data.table) library(ggplot2) library(dplyr) library(circlize) library(readxl) library(extrafont) library("RColorBrewer") # для красивых цветов на мартице, не обязательно dataset <- read_excel("cars_data.xlsx") # файл-образец с сайта # Перевести набор данных в подходящий для пакета colnames(dataset)[1] <- "company" long <- melt(setDT(dataset), id.vars = c("company"), variable.name = "Year") # преобразовать из широкого формата в длинный # Получение данных для построения матрицы svmatrix_prep <- function(data, # набор данных в длинном формате years, # вектор изучаемых годов share_column, # номер столбца долей в данных year_column, # номер столбца годов в данных N # число компаний ) { matrix_data <- data.frame(matrix(NA, 10, 5)) colnames(matrix_data) <- c("Lind", "CRSV", "HTSV", "Quadrant", "Year") count = 1 for (i in years) { colnames(data)[year_column] <- "Year" sv_data <- data%>% filter(as.numeric(as.character(Year)) == as.numeric(i)) colnames(sv_data)[share_column] <- "Value" sv_vec <- c(t(sv_data$Value)) sv_vector <- sort(sv_vec, decreasing = TRUE) Qsum <- NA CR_i <- cumsum(sv_vector) Qmat <- matrix(NA, nrow = N, ncol = N-1) for (m in c(1:N-1)) { for (l in c((m+1):(N))) { Qmat[l, m] <- (CR_i[m]/m)/((CR_i[l]-CR_i[m])/(l-m)) } Qsum <- c(Qsum, sum(Qmat[m+1,], na.rm = TRUE)) } Qsum <- Qsum[2:N] L <- c(rep(NA, N)) for (m in c(2:N)) { L[m] <- Qsum[m]*(1/(m*(m-1))) } Lind <- NA for (m in c(2:N)) { if (L[m+1]>L[m]) { Lind = m break } } if (is.na(Lind) == TRUE) { break } CRSV <- sum(sv_vector[1:Lind]) CR_norm <- sv_vector/sum(sv_vector[1:Lind])*c(1:N) HTn <- 1/(2*cumsum(CR_norm)-1) HTSVn <- (HTn-1/c(1:N))/(1-1/c(1:N)) HTSV <- HTSVn[Lind] if (CRSV > 0.65 & HTSV > 0.1) { Quad = "G" }else{ if (CRSV < 0.65 & HTSV > 0.1) { Quad = "I" }else{ if (CRSV > 0.65 & HTSV < 0.1) { Quad = "B4" }else{ Quad = "RO" } } } matrix_data[count,] <- as.numeric(c(as.character(Lind), as.character(CRSV), as.character(HTSV), NA, i)) matrix_data[count, 4] <- Quad count = count + 1 } count = 1 matrix_data <- na.omit(matrix_data) return(matrix_data) } # Функция расчета данных для матрицы SV_data <- svmatrix_prep(long, years = c(2011:2021), share_column = 3, year_column = 2, 18) # Построение матрицы (текущая версия выдает ошибку, но матрица строится) svmatrix <- function(svmatrix_prep_dataset, # Полученный с помощью формулы svmatrix_prep набор данных, необходимо ввести label_x_offset = -0.005, # Сдвиг подписей года по оси x, задается как одно число или вектор длины число годов label_y_offset = 0.004, # Сдвиг подписей года по оси y, задается как одно число или вектор длины число годов legend_position = "topleft", # Расположение легенды legend_inset = c(-0.2, 0), # Сдвиг легенды, вектор (x, y) labels.off = FALSE, # Отключить подписи годов, TRUE|FALSE Lind.off = FALSE, # Отключить подпись коэффициента Линда на точках, TRUE|FALSE legend.off = FALSE, # Убрать легенду, TRUE|FALSE point_size = svmatrix_prep_dataset$Lind, # Размер точек B4_label = c(0.825, 0.03), # Расположение подписи "B4" на матрице G_label = c(0.825, 0.3), # Расположение подписи "G" на матрице RO_label = c(0.475, 0.03), # Расположение подписи "RO" на матрице I_label = c(0.475, 0.3), # Расположение подписи "I" на матрице xlim = c(0.3, 1), # Границы оси x ylim = c(0.01, 1), # Границы оси y cex = 0.8, # Размер легенды text.cex = 0.7, # Размер подписей годов bg_col = "white", # Цвет фона plot_col = "white", # Цвет окна построения quad_col = "grey", # цвет подписи квадрантов quad_size = 4, # Размер подписи квадрантов pch = 16, # Форма точек point_col = 2:nrow(svmatrix_prep_dataset), # Цвет точек, задается вектором цветов (рекомендуется использовать готовые палитры) axis_font = "Arial", # Шрифт подписей осей labels_font = "Arial", # Шрифт подписей годов axis_font_type = 2, # Тип подписей осей labels_font_type = 1, # Тип подписей годов add_line = FALSE, # Добавить линию, последовательно соеднияющую точки, TRUE/FALSE line_col = "red", # Цвет линии line_size = 1, # Ширина линии line_type = "dashed", # Тип линии cex.lab=1.5, # размер подписей осей labs = svmatrix_prep_dataset$Lind, # Текст внутри точек notes = svmatrix_prep_dataset$Year # Текст рядом с точками ){ par(mar = c(5, 5, 4, 8), bg = bg_col) plot.new() rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = plot_col) par(new = TRUE) plot(x = 1, y = 1, log = "y", xlim = xlim, ylim = ylim, col = plot_col, pch = pch, cex.lab=cex.lab, xlab="CRSV - доля отраслевого рынка, контролируемая группой доминирующих альфа-компаний", ylab="HTSV - уровень дифференициации между доминирующими в подотраслях альфами", family = labels_font, font = axis_font_type) + text(B4_label[1], B4_label[2], expression("B4"), cex = quad_size, col = quad_col) + text(G_label[1], G_label[2], expression("G"), cex = quad_size, col = quad_col) + text(RO_label[1], RO_label[2], expression("RO"), cex = quad_size, col = quad_col) + text(I_label[1], I_label[2], expression("I"), cex = quad_size, col = quad_col) + abline(v = 0.65) + abline(h = 0.1) + lines(svmatrix_prep_dataset$CRSV*(100*as.integer(add_line == FALSE)+1), svmatrix_prep_dataset$HTSV, col = line_col, lwd = line_size, lty = line_type) + points(svmatrix_prep_dataset$CRSV, svmatrix_prep_dataset$HTSV, cex = point_size, pch = pch, col = point_col) + text(svmatrix_prep_dataset$CRSV+label_x_offset*point_size/2*(100*as.integer(labels.off == TRUE)+1), svmatrix_prep_dataset$HTSV+label_y_offset*point_size/2, labels = notes, cex = text.cex, family = labels_font, font = labels_font_type) + text(svmatrix_prep_dataset$CRSV*(100*as.integer(Lind.off == TRUE)+1), svmatrix_prep_dataset$HTSV, labels = labs, cex = max(0.25, point_size/8), col = "grey26") + legend(legend_position, inset = legend_inset+c(100*as.integer(legend.off == TRUE), 0), legend = c(svmatrix_prep_dataset$Year), cex = cex, pch = pch, title = "Year", col = 2:nrow(svmatrix_prep_dataset), xpd = TRUE) } # Функция для построения готовой матрицы svmatrix(SV_data, label_x_offset = c(rep(0.009, 2), rep(-0.009, 13)), label_y_offset = c(rep(-0.001, 4), rep(0.001, 11)), ylim = c(0.002, 0.1), xlim = c(0.4, 1), text.cex = 1, point_size = SV_data$Lind, legend_position = "topleft", legend_inset = c(0,100), cex = 0.75, point_col = brewer.pal(n = 15, name = "Dark2"), cex.lab = 1.5, pch = 19, bg_col = "lightblue2", plot_col = "white", quad_col = "darkgrey", quad_size = 8, axis_font = "Arial", add_line = TRUE, line_col = "red", line_size = 2)